package com.example.rsalogindemo.controller;

import com.example.rsalogindemo.util.RSAEncrypt;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 所需js文件：链接: https://pan.baidu.com/s/1ksN9J5TUJMW9MXUBpiVD2g 提取码: vqcm
 * 大致流程：
 * 1、进入登录页面前通过java后台获取公钥与私钥
 * 2、将私钥存入session中，将私钥传入前端页面
 * 3、在前端页面通过公钥对需要进行加密的对象进行加密得到新的对象
 * 4、将得到新对象传入后台，获取session中的私钥进行解密
 */
public class Login {
    /**
     * 进入登录页面前操作
     *
     * @param req
     * @return
     */
    @RequestMapping("login")
    public ModelAndView login(HttpServletRequest req) {
        ModelAndView view = new ModelAndView();
        try {
            Map<Integer, String> genKeyPair = RSAEncrypt.genKeyPair();
            Map<String, String> map = new HashMap<String, String>();
            // 得到公钥
            String gkey = genKeyPair.get(0);
            // 将私钥存入session中
            req.getSession().setAttribute("skey", genKeyPair.get(1));
            //将公钥发往前端页面留存在浏览器中
            view.addObject("gkey", gkey);
            view.setViewName("login.jsp");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return view;
    }

    /**
     * 登录验证
     *
     * @throws Exception
     */
    @RequestMapping("loginJudged")
    @ResponseBody
    public Map<String, String> loginJudged(HttpServletRequest request, String struserid) {
        // 定义返回前台页面Map
        Map<String, String> map = new HashMap<String, String>();
        try {
            // 在session中获取私钥
            Object skey = request.getSession().getAttribute("skey");
            // rsa解密得到加密前的数据--解密结束
            //此时前端发过来的struserid是通过公钥加密后的字符串，后端通过私钥解密得到原始密码
            String userId = RSAEncrypt.decrypt(struserid, skey.toString());
            /*
             * 业务逻辑代码
             */
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

}
